/**
  * Author: Mei
  * Date: 2020-12-10 10:09
  * Description: 
  * 模板模板参数
  *
  */
#include <vector>
#include <iostream>
#include <bitset>
#include <functional>
#include <algorithm>
#include <list>

using namespace std;

template<typename T>
class MyAlloc {


};

void MyString() {

}

template<typename Container>
void test_moveable(Container c) {
    //获取容器的iterator 然后用萃取机  萃取迭代器的类型
    typedef typename iterator_traits<typename Container::iterator>::value_type ValType;

    for (long i = 0; i < 2000; ++i) {
        c.insert(c.end(), ValType());
    }
    //....
}

//第二种 编译通过  但运行失败  因为vector<int, allocator> 需要知道allocator
template<typename T,
        template<class T> //第二个T可以省略不写
        class Container
    >
class XCLs {
private:
    Container<T> c;
public:
    XCLs() {
        c.insert(T());
    }
};
//可以写成这样 不能写在函数里面
template<typename T>
using Vec = vector<T, allocator<T>>;


int main() {
    typedef vector<int, MyAlloc<int>> vec; //不能指定参数类型

    template<typename T>
    using vec = vector<T, MyAlloc<T>>; //可以指定其类型
    vec<int> coll; //不能做特化
    vec<double> coll;

    test_moveable(list<MyString>());

    XCLs<MyString, vector> xcLs;

    //这样调用
    XCLs<MyString, Vec> xc1;


    return 0;
}
